The fan is not merely the superficial utensil for cooling on hot summer days, but equally an instrument of coquetry and communication. It is an accessory that like its archetype - the plumage of some birds - serves to attract attention and zestfulness. The work Abanico takes advantage of these qualities of the fan: A sensor detects persons infront of the work, the machine unfolds a wooden folding fan and performs a classic gesture, with which it aspires attention.
Photography: Image Recorder
Technical description
wooden fan, aluminium plates, steel tube, Grove Ultrasonic Ranger, servo motors,
Arduino Duemilanove, custom electronics
Arduino - Code
/* Created by Jochen Zeirzer http://www.jochen_zeirzer.public2.linz.at/ project: abanico year: 2013
Ping))) Sensor http://www.arduino.cc/en/Tutorial/Ping
created 3 Nov 2008 by David A. Mellis modified 30 Aug 2011 by Tom Igoe */
#include <VarSpeedServo.h>
//Servos // create variable speed servo objects to control servos 1-3 VarSpeedServo servo1; // Servo to tilt Fan VarSpeedServo servo2; // Servo to open and close Fan VarSpeedServo servo3; // Servo to rotate Base
int trans1 = 6; // transistor to switch Servo 1 on Pin 11 int trans2 = 5; // transistor to switch Servo 2 on Pin 10 int trans3 = 3; // transistor to switch Servo 3 on Pin 9
int counter; // initialize a counter to count how often the distance has been measured int wait = 5250; // initialize a delay for the calibration movement - every 5250 measurements (approx. every 10 min)
const int pingPin = 7; // Grove Ultrasonic Ranger on Pin 7 const int threshold = 140; // Threshold level digital input (Ultra Sonic Ranger)
void setup() {
// initialize serial communication Serial.begin(9600);
pinMode(trans1, OUTPUT); // initialize the Transistors 1 - 3 as output: pinMode(trans2, OUTPUT); pinMode(trans3, OUTPUT);
servo1.attach(11); // Servo 1 (Fan Tilt) on pin 11 servo1.writeMicroseconds(620); // variable speed servo1 position in Microdseconds servo2.attach(10); // Servo 2 (Fan open/close) on pin 10 servo2.writeMicroseconds(570); // variable speed servo1 position in Microdseconds servo3.attach(9); // Servo 3 (Base rotation) on pin 9 servo3.writeMicroseconds(600); // variable speed servo1 position in Microdseconds
digitalWrite(trans1, LOW); // Set default state of Transistors 1 - 3 to LOW digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); }
long microsecondsToCentimeters(long microseconds) { // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance travelled. return microseconds / 29 / 2; }
void loop() {
counter += 1; // establish variables for duration of the ping, // and the distance result in centimeters: long duration, cm;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: pinMode(pingPin, OUTPUT); digitalWrite(pingPin, LOW); delayMicroseconds(2); digitalWrite(pingPin, HIGH); delayMicroseconds(5); digitalWrite(pingPin, LOW);
// The same pin is used to read the signal from the PING))): a HIGH // pulse whose duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. pinMode(pingPin, INPUT); duration = pulseIn(pingPin, HIGH);
// convert the time into a distance cm = microsecondsToCentimeters(duration);
int digitalValue = microsecondsToCentimeters(duration);
Serial.print(cm); Serial.print("cm"); Serial.print(", counter "); Serial.print(counter); Serial.println();
delay(100);
if(counter >= wait) { // If the counter reaches the benchmark of "wait" (5250 distance measurments) start calibration movement
digitalWrite(trans1, HIGH); digitalWrite(trans2, HIGH); digitalWrite(trans3, HIGH); servo1.writeMicroseconds(620); servo2.writeMicroseconds(570); servo3.writeMicroseconds(600); delay(100); servo2.slowmove(2500, 40); delay(1800); digitalWrite(trans1, LOW); digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); delay(5000); digitalWrite(trans1, HIGH); digitalWrite(trans2, HIGH); digitalWrite(trans3, HIGH); servo2.slowmove(600, 40); delay(1500); servo2.writeMicroseconds(600); delay(100); digitalWrite(trans1, LOW); digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); counter = 0; // reset counter to 0 }
if(digitalValue < threshold) { // If the measured distance drops below 140cm start full movement of the fan counter = 0; // reset counter to 0
digitalWrite(trans1, HIGH); digitalWrite(trans2, HIGH); digitalWrite(trans3, HIGH); servo1.slowmove(1625, 120); delay(350); servo2.slowmove(2500, 160); delay(600); digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); delay(500); digitalWrite(trans1, HIGH); digitalWrite(trans3, HIGH); servo1.slowmove(880, 20); servo3.slowmove(2350, 60); delay(1300); digitalWrite(trans3, LOW); delay(50); digitalWrite(trans1, LOW); delay(4000); digitalWrite(trans1, HIGH); digitalWrite(trans2, HIGH); digitalWrite(trans3, HIGH); servo1.slowmove(620, 10); servo2.slowmove(625, 40); servo3.slowmove(580, 40); delay(1620); servo2.writeMicroseconds(570); delay(200); digitalWrite(trans1, LOW); digitalWrite(trans2, LOW); digitalWrite(trans3, LOW); delay(4000);
counter = 0; // reset counter to 0
} }
The machine Abanico is part of my final projekt TRIVIAL MOTION at the Art University Linz, Department for Experimental Arts.
The diploma TRIVIAL MOTION is available in german only.